package com.electronic.jwt;


import com.electronic.constant.JwtConstant;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;

/**
 * @Author: IFCA
 * @Description: Jwt提供者
 */
@Slf4j
public class JwtProvider {



    /**
     * @param expireSeconds 过期时间（秒）
     * @param appId 接入应用id
     * @param userId 接入应用用户id
     * @param reqTransactionId 请求唯一id
     * @param secretKey 秘钥
     */
    public static String createJWT(int expireSeconds, String appId, String userId, String bizNo, String reqTransactionId, String secretKey) {
        //生成 HMAC 密钥，根据提供的字节数组长度选择适当的 HMAC 算法，并返回相应的 SecretKey 对象。
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
        // 设置jwt的body
        JwtBuilder builder = Jwts.builder()
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(key)
                // 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
                .claim(JwtConstant.CLAIM_APP_ID_KEY, appId)
                .claim(JwtConstant.CLAIM_USER_ID_KEY, userId)
                .claim(JwtConstant.REQ_TRANSACTION_ID, reqTransactionId)
                .claim(JwtConstant.CLAIM_BIZ_NO_KEY, bizNo)
                // 设置过期时间
                .expiration(DateTime.now().plusSeconds(expireSeconds).toDate());
        return builder.compact();
    }


}
